const fs = require('fs');
const path = require('path');

/**
 * 在文件的最后一个import语句后插入指定导入
 * @param {string} filePath 文件路径
 * @returns {boolean} 是否修改了文件
 */
function insertImport(filePath) {
    try {
        // 读取文件内容
        const content = fs.readFileSync(filePath, 'utf8');
        
        // 定义要插入的导入语句
        const importToInsert = 'import { __memo_context_type as __memo_context_type, __memo_id_type as __memo_id_type } from "@ohos.arkui.stateManagement";';
        
        // 正则表达式匹配所有import语句
        const importRegex = /^(\s*import\s+.+?;)\s*$/gm;
        const imports = [];
        let match;
        
        // 收集所有import语句的位置
        while ((match = importRegex.exec(content)) !== null) {
            imports.push({
                index: match.index,
                length: match[0].length,
                line: match[1]
            });
        }
        
        // 如果没有找到import语句，则在文件开头插入
        if (imports.length === 0) {
            const newContent = importToInsert + '\n' + content;
            fs.writeFileSync(filePath, newContent, 'utf8');
            console.log(`✓ 在文件开头插入导入: ${filePath}`);
            return true;
        }
        
        // 找到最后一个import语句的位置
        const lastImport = imports[imports.length - 1];
        const insertPosition = lastImport.index + lastImport.length;
        
        // 插入新的导入语句
        const newContent = content.substring(0, insertPosition) + 
                          '\n' + importToInsert + 
                          content.substring(insertPosition);
        
        // 写入更新后的内容
        fs.writeFileSync(filePath, newContent, 'utf8');
        console.log(`✓ 在最后一个import后插入: ${filePath}`);
        return true;
    } catch (error) {
        console.error(`✗ 处理文件时出错 (${filePath}): ${error.message}`);
        return false;
    }
}

/**
 * 遍历目录并处理所有文件
 * @param {string} dirPath 目录路径
 * @returns {number} 修改的文件数量
 */
function processDirectory(dirPath) {
    console.log(`扫描目录: ${dirPath}`);
    let modifiedCount = 0;
    
    try {
        const entries = fs.readdirSync(dirPath, { withFileTypes: true });
        
        for (const entry of entries) {
            const entryPath = path.join(dirPath, entry.name);
            
            if (entry.isDirectory()) {
                // 递归处理子目录
                modifiedCount += processDirectory(entryPath);
            } else if (entry.isFile()) {
                // 处理文件
                if (insertImport(entryPath)) {
                    modifiedCount++;
                }
            }
        }
        
        return modifiedCount;
    } catch (error) {
        console.error(`✗ 扫描目录时出错: ${error.message}`);
        return 0;
    }
}

/**
 * 主函数
 */
function main() {
    const args = process.argv.slice(2);
    
    if (args.length < 1) {
        console.log('使用方法: node insert-import.js <目录路径>');
        process.exit(1);
    }
    
    const targetDir = path.resolve(args[0]);
    
    // 检查目录是否存在
    if (!fs.existsSync(targetDir)) {
        console.error(`错误: 目录 '${targetDir}' 不存在`);
        process.exit(1);
    }
    
    console.log(`=== 导入声明插入工具 ===`);
    console.log(`目标目录: ${targetDir}\n`);
    
    // 处理目录
    const modifiedCount = processDirectory(targetDir);
    
    console.log(`\n处理完成:`);
    console.log(`  共扫描: ${targetDir}`);
    console.log(`  共修改: ${modifiedCount} 个文件`);
}

// 执行主函数
main();    